package com.sprouting.ops.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sprouting.ops.annotations.invoke.IdempotentSingle;
import com.sprouting.ops.interfaces.AddGroup;
import com.sprouting.ops.interfaces.ConstantBase;
import com.sprouting.ops.interfaces.UpdGroup;
import com.sprouting.ops.model.OpsEnv;
import com.sprouting.ops.model.ResultJson;
import com.sprouting.ops.model.qo.OpsEnvQo;
import com.sprouting.ops.service.OpsEnvService;
import com.sprouting.ops.utils.CheckTool;
import com.sprouting.ops.utils.EntityTool;
import com.sprouting.ops.utils.IdTool;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * (OpsEnv)(ops_env) 表控制层
 *
 * @author ：lx（长沙麓谷）
 * @date 创建时间：2025-06-23 10:51:07
 */
@Slf4j
@RestController
@RequestMapping("opsEnv")
public class OpsEnvController {

    @Resource
    private OpsEnvService opsEnvService;


    /**
     * 查询可复用的环境
     * 过滤条件，
     *      1、已经被使用的环境和部署id关联的不再次查询出来
     *      2、只有当前场所有这个产品有这个环境才查询出来
     *      3、这个产品只有有这个组件依赖才查出来
     *      4、这个产品依赖产品的组件也查询出来，但不再次查询下级依赖
     * @param siteId 场所id
     * @param currentDeployId 当前部署Id
     * @return
     */
    @PostMapping("getReuse")
    public ResultJson getReuse(String siteId, String currentDeployId){
        if (CheckTool.checkNull(siteId, currentDeployId)){
            return ResultJson.errorCheck();
        }

        return ResultJson.success(opsEnvService.getReuse(siteId, currentDeployId));
    }

    /**
     * 分页查询
     * @param query 查询参数
     * @return
     */
    @PostMapping("getListPage")
    public ResultJson getListPage(@Validated OpsEnvQo query){
        Page page = query.getPage();
        return ResultJson.success(opsEnvService.getListPage(page, query));
    }

    /**
     * 删除
     * @param id id
     * @return
     */
    @PostMapping("delOpsEnv")
    @IdempotentSingle
    public ResultJson delOpsEnv(String id){
        if (CheckTool.checkNull(id)){
            return ResultJson.errorCheck();
        }

        opsEnvService.delOpsEnv(id);
        return ResultJson.success();
    }

    /**
     * 更新
     * @param bo 修改参数
     * @return
     */
    @PostMapping("updOpsEnv")
    @IdempotentSingle
    public ResultJson updOpsEnv(@Validated(UpdGroup.class) OpsEnv bo){
        String msg = checkOpsEnv(bo);
        if (msg != null){
            return ResultJson.error(msg);
        }

        EntityTool.updBase(bo);
        opsEnvService.updateById(bo);
        return ResultJson.success(bo);
    }

    /**
     * 保存
     * @param bo 保存参数
     * @return
     */
    @PostMapping("saveOpsEnv")
    @IdempotentSingle
    public ResultJson saveOpsEnv(@Validated(AddGroup.class) OpsEnv bo){
        String msg = checkOpsEnv(bo);
        if (msg != null){
            return ResultJson.error(msg);
        }
        if (bo.getType() == null){
            bo.setType(ConstantBase.EnvType.DEV);
        }

        bo.setId(IdTool.getId());
        EntityTool.saveBase(bo);
        opsEnvService.save(bo);
        return ResultJson.success(bo);
    }


    /**
     * 数据校验
     * @param bo  校验数据
     * @return 非null则有错误
     */
    private String checkOpsEnv(OpsEnv bo){


        return null;
    }

}
